/*
 * 枚举插件
 * 此插件为 1024创新实验室 自创的插件
 */
import _ from 'lodash';
import { App } from 'vue';
import { FLAG_NUMBER_ENUM } from '@/constants/common-const';
import { SmartEnum, SmartEnumWrapper, SmartEnumItem, SmartEnumPlugin } from '@/types/smart-enum';

export default {
  install: <T>(app: App, smartEnumWrapper: SmartEnumWrapper<T>): void => {
    const smartEnumPlugin = {} as SmartEnumPlugin;
    /**
     * 根据枚举值获取描述
     * @param {*} constantName 枚举名
     * @param {*} value          枚举值
     * @returns
     */
    // 根据值获取描述
    smartEnumPlugin.getDescByValue = function (constantName: string, value: any): string {
      // 如果smartEnumWrapper不存在或者constantName不存在smartEnumWrapper中，则返回空字符串
      if (!smartEnumWrapper || !Object.prototype.hasOwnProperty.call(smartEnumWrapper, constantName)) {
        return '';
      }
      // boolean类型需要做特殊处理
      if (constantName === 'FLAG_NUMBER_ENUM' && !_.isUndefined(value) && typeof value === 'boolean') {
        value = value ? FLAG_NUMBER_ENUM.TRUE.value : FLAG_NUMBER_ENUM.FALSE.value;
      }

      // 获取smartEnum
      let smartEnum: SmartEnum<T> = smartEnumWrapper[constantName];
      // 遍历smartEnum
      for (let item in smartEnum) {
        // 如果smartEnum[item].value等于value，则返回smartEnum[item].desc
        if (smartEnum[item].value === value) {
          return smartEnum[item].desc;
        }
      }
      // 如果没有找到匹配的值，则返回空字符串
      return '';
    };
    /**
     * 根据枚举名获取对应的描述键值对[{value:desc}]
     * @param {*} constantName 枚举名
     * @returns
     */
    // 获取指定常量的描述列表
    smartEnumPlugin.getValueDescList = function <T>(constantName: string): SmartEnumItem<T>[] {
      // 判断smartEnumWrapper对象中是否存在指定常量
      if (!Object.prototype.hasOwnProperty.call(smartEnumWrapper, constantName)) {
        // 如果不存在，返回空数组
        return [];
      }
      // 定义结果数组
      const result: SmartEnumItem<T>[] = [];
      // 获取指定常量的值
      let targetSmartEnum = smartEnumWrapper[constantName];
      // 遍历指定常量的值
      for (let item in targetSmartEnum) {
        // 将指定常量的值添加到结果数组中
        result.push(targetSmartEnum[item] as any);
      }
      console.log(result);
      // 返回结果数组
      return result;
    };

    /**
     * 根据枚举名获取对应的value描述键值对{value:desc}
     * @param {*} constantName 枚举名
     * @returns
     */
    // 获取智能枚举的描述
    smartEnumPlugin.getValueDesc = function (constantName: string): { [key: string]: string } {
      // 判断智能枚举包装器中是否存在该常量名
      if (!Object.prototype.hasOwnProperty.call(smartEnumWrapper, constantName)) {
        // 如果不存在，返回空对象
        return {};
      }
      // 获取智能枚举
      let smartEnum = smartEnumWrapper[constantName];
      // 定义结果对象
      let result = {} as { [key: string]: string };
      // 遍历智能枚举
      for (let item in smartEnum) {
        // 获取智能枚举项的值
        let key: string = smartEnum[item].value + '';
        // 将智能枚举项的值和描述存入结果对象
        result[key] = smartEnum[item].desc;
      }
      // 返回结果对象
      return result;
    };

    app.config.globalProperties.$smartEnumPlugin = smartEnumPlugin;
    app.provide('smartEnumPlugin', smartEnumPlugin);
  },
};
